package me.ydq.core.table;

import me.ydq.mapper.Mapping;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SingleColumnRowMapper;

import java.util.List;

/**
 * 列表查询相关的方法和重载，支持 offset/size 限制查询条数，如果没有分页参数，则默认返回全部满足条件的结果集
 */
public interface TableList<T> extends TableBase<T> {


    <R> List<R> list(int offset, int size, RowMapper<R> mapper);

    <R> List<R> list(RowMapper<R> mapper);

    /**
     * 适合于查询类似于 distinct x 这样的字段
     */
    default <R> List<R> list(Class<R> returnType) {
        return list(new SingleColumnRowMapper<>(returnType));
    }

    /**
     * 适合于查询类似于 distinct x 这样的字段
     */
    default <R> List<R> list(Mapping<R> typeMapper) {
        return list((rs, i) -> typeMapper.map(rs));
    }

    /**
     * 适合于单字段的查询
     */
    default <R> List<R> list(int offset, int size, Class<R> returnType) {
        return list(offset, size, new SingleColumnRowMapper<>(returnType));
    }

    default <R> List<R> list(int offset, int size, Mapping<R> mapper) {
        return list(offset, size, (rs, i) -> mapper.map(rs));
    }


    default List<T> list() {
        return list(rowMapper());
    }

    default List<T> list(int offset, int size) {
        return list(offset, size, rowMapper());
    }
}
